/**
 * orthancService.js - 与 Orthanc DICOM 服务器通信的服务
 */
import axios from 'axios';

// 配置 Orthanc 服务器 URL 和认证信息
const ORTHANC_URL = process.env.VUE_APP_ORTHANC_URL || 'http://10.10.22.47:8042';
const ORTHANC_USERNAME = process.env.VUE_APP_ORTHANC_USERNAME || 'orthanc';
const ORTHANC_PASSWORD = process.env.VUE_APP_ORTHANC_PASSWORD || 'orthanc123';

// 创建 axios 实例
const api = axios.create({
  baseURL: ORTHANC_URL,
  timeout: 30000,
  headers: {
    'Content-Type': 'application/json'
  },
  // 添加基本认证
  auth: {
    username: ORTHANC_USERNAME,
    password: ORTHANC_PASSWORD
  }
});

/**
 * 带重试的 API 请求
 * @param {Function} apiCall - API 调用函数
 * @param {number} retries - 重试次数
 * @returns {Promise} API 响应
 */
async function withRetry(apiCall, retries = 3) {
  let lastError;
  
  for (let i = 0; i < retries; i++) {
    try {
      return await apiCall();
    } catch (error) {
      console.warn(`API 请求失败，尝试重试 (${i + 1}/${retries})`, error);
      lastError = error;
      
      // 等待一段时间再重试
      await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1)));
    }
  }
  
  throw lastError;
}

export default {
  /**
   * 获取研究信息
   * @param {string} studyId - 研究ID
   * @returns {Promise<Object>} 研究信息
   */
  async getStudy(studyId) {
    return withRetry(async () => {
      const response = await api.get(`/studies/${studyId}`);
      return response.data;
    });
  },

  /**
   * 获取序列信息
   * @param {string} seriesId - 序列ID
   * @returns {Promise<Object>} 序列信息
   */
  async getSeries(seriesId) {
    try {
      const response = await api.get(`/series/${seriesId}`);
      return response.data;
    } catch (error) {
      console.error('获取序列失败:', error);
      throw error;
    }
  },

  /**
   * 获取研究的所有序列
   * @param {string} studyId - 研究ID
   * @returns {Promise<Array>} 序列列表
   */
  async getSeriesList(studyId) {
    try {
      const response = await api.get(`/studies/${studyId}/series`);
      
      // 获取每个序列的详细信息
      const seriesPromises = response.data.map(seriesId => 
        this.getSeries(seriesId)
      );
      
      return Promise.all(seriesPromises);
    } catch (error) {
      console.error('获取序列列表失败:', error);
      throw error;
    }
  },

  /**
   * 获取序列的所有实例
   * @param {string} seriesId - 序列ID
   * @returns {Promise<Array>} 实例列表
   */
  async getInstances(seriesId) {
    try {
      const response = await api.get(`/series/${seriesId}/instances`);
      return response.data;
    } catch (error) {
      console.error('获取实例列表失败:', error);
      throw error;
    }
  },

  /**
   * 获取实例的 DICOM 标签
   * @param {string|Object} instance - 实例ID或实例对象
   * @returns {Promise<Object>} DICOM 标签
   */
  async getInstanceTags(instance) {
    try {
      // 确保我们有一个有效的实例ID
      let instanceId;
      if (typeof instance === 'string') {
        instanceId = instance;
      } else if (instance && instance.ID) {
        instanceId = instance.ID;
      } else {
        throw new Error('无效的实例参数');
      }
      
      const response = await api.get(`/instances/${instanceId}/tags`);
      return response.data;
    } catch (error) {
      console.error('获取实例标签失败:', error);
      throw error;
    }
  },

  /**
   * 获取实例的原始 DICOM 数据
   * @param {string} instanceId - 实例ID
   * @returns {Promise<ArrayBuffer>} 原始 DICOM 数据
   */
  async getInstanceDicom(instanceId) {
    try {
      const response = await api.get(`/instances/${instanceId}/file`, {
        responseType: 'arraybuffer'
      });
      return response.data;
    } catch (error) {
      console.error('获取实例 DICOM 数据失败:', error);
      throw error;
    }
  },

  /**
   * 获取实例的图像
   * @param {string} instanceId - 实例ID
   * @param {number} quality - 图像质量 (0-100)
   * @returns {string} 图像 URL
   */
  getInstanceImageUrl(instanceId, quality = 90) {
    // 使用 Base64 编码的认证信息
    const authString = btoa(`${ORTHANC_USERNAME}:${ORTHANC_PASSWORD}`);
    return `${ORTHANC_URL}/instances/${instanceId}/preview?quality=${quality}&auth=${authString}`;
  },

  /**
   * 获取 WADO URI 格式的图像 URL
   * @param {string} studyUID - 研究 UID
   * @param {string} seriesUID - 序列 UID
   * @param {string} instanceUID - 实例 UID
   * @returns {string} WADO URI
   */
  getWadoUrl(studyUID, seriesUID, instanceUID) {
    // 使用 Base64 编码的认证信息
    const authString = btoa(`${ORTHANC_USERNAME}:${ORTHANC_PASSWORD}`);
    return `${ORTHANC_URL}/wado?requestType=WADO&studyUID=${studyUID}&seriesUID=${seriesUID}&objectUID=${instanceUID}&contentType=application/dicom&auth=${authString}`;
  }
}; 